package com.shi.study.lanmda;

import java.util.function.*;

class Dog{
    private String name="默认狗";

    public Dog(){}

    public Dog(String name){
        this.name=name;
    }

    public static void bark(String barkContent){
        System.out.println("一只无名野狗在叫："+barkContent);
    }

    public int eat(int sum){
        System.out.println(this.name+"吃了"+sum+"斤狗粮。");
        return sum;
    }

}

public class FunctionTest {

    public static void main(String[] args){
        Dog dog=new Dog();

        //普通匿名方法引用
        Consumer<String> consumer=System.out::println;
        consumer.accept("嘿嘿嘿");
        Function<String,String> otherFunction=s->{
                System.out.println(s);
                return s;
        };
        otherFunction.andThen(s->"hello,"+s);
        otherFunction.apply("哈哈哈");

        //静态方法引用
        Consumer<String> staticConsumer=Dog::bark;
        staticConsumer.accept("hello");

        //使用对象实例进行普通成员方法的引用
        IntUnaryOperator intFunction=dog::eat;
        //Q:如果在此处加一行 dog=null;会不会报错？A:不会，因为创建该IntUnaryOperator时已经将dog所指向的对象传递过去了。
        intFunction.applyAsInt(10);

        //使用类名进行普通成员方法的引用
        BiFunction<Dog,Integer,Integer> biFunction=Dog::eat;
        biFunction.apply(dog,10);

        //无参构造方法的应用
        Supplier<Dog> supplier=Dog::new;
        System.out.println(supplier.get().eat(20));

        //有参构造方法的引用
        Function<String,Dog> function=Dog::new;
        System.out.println(function.apply("哈哈狗").eat(22));
    }

}
